Priorbox

根据输入的特征图尺寸、步长和预设的候选框配置,逐元素计算先验框(Prior Boxes),通常用于目标检测模型。

该算子遍历特征图的每一个网格中心点,并围绕该中心点生成一系列具有不同尺寸和宽高比的候选框。生成的坐标 [xmin, ymin, xmax, ymax] 经过归一化处理。

输入:
  • fmap_h - 当前特征图的高度。

  • fmap_w - 当前特征图的宽度。

  • step_h - 计算先验框在原图上坐标时的垂直缩放比例。

  • step_w - 计算先验框在原图上坐标时的水平缩放比例。

  • offset - 中心点偏移量,通常为0.5,表示取网格的正中心。

  • min_sizes - 定义基础先验框尺寸的浮点数数组。

  • min_sizes_size - min_sizes 数组的长度。

  • max_sizes - 可选的浮点数数组,用于生成额外的正方形先验框。

  • max_sizes_size - max_sizes 数组的长度。

  • different_aspect_ratios - 定义不同宽高比的浮点数数组。

  • different_aspect_ratios_size - different_aspect_ratios 数组的长度。

  • core_mask - 核掩码 (仅共享存储版本需要)。

输出:
  • output - 用于存储最终生成的先验框坐标的数组。

  • output_size - 指向一个整数的指针,函数执行后,该整数将记录写入 output 数组的浮点数总数。

支持平台:

6678 7004

备注

  • 6678支持fp32类型。

  • 7004支持fp16和fp32类型。

共享存储版本:

int fp_priorbox_s(int fmap_h, int fmap_w, float step_h, float step_w, float offset, float *min_sizes, int min_sizes_size, float *max_sizes, int max_sizes_size, float *different_aspect_ratios, int different_aspect_ratios_size, float *output, int *output_size, int core_mask)
int hp_priorbox_s(int fmap_h, int fmap_w, half step_h, half step_w, half offset, half *min_sizes, int min_sizes_size, half *max_sizes, int max_sizes_size, half *different_aspect_ratios, int different_aspect_ratios_size, half *output, int *output_size, int core_mask)

C调用示例:

 1#include "priorbox.h"
 2
 3int main() {
 4    // DDR memory pointers
 5    float *min_sizes = (float *)0xA0000000;
 6    float *max_sizes = (float *)0xA0001000;
 7    float *ratios = (float *)0xA0002000;
 8    float *output = (float *)0xB0000000;
 9    int output_size = 0;
10
11    // Parameters
12    int fmap_h = 19, fmap_w = 19;
13    float step_h = 16.0f, step_w = 16.0f;
14    float offset = 0.5f;
15    int min_sizes_size = 1;
16    int max_sizes_size = 1;
17    int ratios_size = 2;
18    int core_mask = 0xff;
19
20    // (假设 min_sizes, max_sizes, ratios 已在DDR中填充数据)
21
22    fp_priorbox_s(fmap_h, fmap_w, step_h, step_w, offset, min_sizes, min_sizes_size, max_sizes, max_sizes_size, ratios, ratios_size, output, &output_size, core_mask);
23
24    return 0;
25}

私有存储版本:

int fp_priorbox_p(int fmap_h, int fmap_w, float step_h, float step_w, float offset, float *min_sizes, int min_sizes_size, float *max_sizes, int max_sizes_size, float *different_aspect_ratios, int different_aspect_ratios_size, float *output, int *output_size)
int hp_priorbox_p(int fmap_h, int fmap_w, half step_h, half step_w, half offset, half *min_sizes, int min_sizes_size, half *max_sizes, int max_sizes_size, half *different_aspect_ratios, int different_aspect_ratios_size, half *output, int *output_size)

C调用示例:

 1#include "priorbox.h"
 2
 3int main() {
 4    // L2 memory arrays
 5    float min_sizes_data[] = {30.0f};
 6    float max_sizes_data[] = {60.0f};
 7    float ratios_data[] = {2.0f, 0.5f};
 8    float output_data[4 * 19 * 19 * (1 + 1 + 2)]; // 足够大的空间
 9    int output_size = 0;
10
11    // Parameters
12    int fmap_h = 19, fmap_w = 19;
13    float step_h = 16.0f, step_w = 16.0f;
14    float offset = 0.5f;
15
16    fp_priorbox_p(fmap_h, fmap_w, step_h, step_w, offset, min_sizes_data, 1, max_sizes_data, 1, ratios_data, 2, output_data, &output_size);
17
18    return 0;
19}